Micron Document
🎖️GitЯра🎖️

Node / meshcore / MeshCore / files / src / helpers / ESP32Board.h

Displaying Raw • Download

src/helpers/ESP32Board.h 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 5.69 KB

Tff7b72#Tff7b72pragma once

Tff7b72#Tff7b72include T8b949e<MeshCore.h>
Tff7b72#Tff7b72include T8b949e<Arduino.h>

Tff7b72#Tff7b72ifndef USER_BTN_PRESSED
Tff7b72#Tff7b72define USER_BTN_PRESSED LOW
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72if defined(ESP_PLATFORM)

Tff7b72#Tff7b72include T8b949e<rom/rtc.h>
Tff7b72#Tff7b72include T8b949e<sys/time.h>
Tff7b72#Tff7b72include T8b949e<Wire.h>
Tff7b72#Tff7b72include T8b949e"soc/rtc.h"
Tff7b72#Tff7b72include T8b949e"esp_system.h"
Tff7b72#Tff7b72include T8b949e<driver/rtc_io.h>

Te6edf3class Te6edf3ESP32Board Tff7b72: Te6edf3public Te6edf3meshTff7b72:Tff7b72:Te6edf3MainBoard Tb4b4b4{
Te6edf3protectedTff7b72:
Tffa657uint8_t Te6edf3startup_reasonTb4b4b4;
Tffa657bool Te6edf3inhibit_sleep Tff7b72= Tffa657falseTb4b4b4;
Tff7b72static Tff7b72inline Te6edf3portMUX_TYPE Te6edf3sleepMux Tff7b72= Te6edf3portMUX_INITIALIZER_UNLOCKEDTb4b4b4;

Te6edf3publicTff7b72:
Tffa657void Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// for future use, sub-classes SHOULD call this from their begin()
Te6edf3startup_reason Tff7b72= Te6edf3BD_STARTUP_NORMALTb4b4b4;

Tff7b72#Tff7b72ifdef ESP32_CPU_FREQ
Te6edf3setCpuFrequencyMhzTb4b4b4(Te6edf3ESP32_CPU_FREQTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72ifdef PIN_VBAT_READ
T8b949e// battery read support
Te6edf3pinModeTb4b4b4(Te6edf3PIN_VBAT_READTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Te6edf3adcAttachPinTb4b4b4(Te6edf3PIN_VBAT_READTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72ifdef P_LORA_TX_LED
Te6edf3pinModeTb4b4b4(Te6edf3P_LORA_TX_LEDTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3P_LORA_TX_LEDTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL)
Tff7b72#Tff7b72if PIN_BOARD_SDA >= 0 && PIN_BOARD_SCL >= 0
Te6edf3WireTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3PIN_BOARD_SDATb4b4b4, Te6edf3PIN_BOARD_SCLTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72else
Te6edf3WireTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}

T8b949e// Temperature from ESP32 MCU
Tffa657float Te6edf3getMCUTemperatureTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tffa657uint32_t Te6edf3raw Tff7b72= T79c0ff0Tb4b4b4;

T8b949e// To get and average the temperature so it is more accurate, especially in low temperature
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff4Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3raw Tff7b72+Tff7b72= Te6edf3temperatureReadTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3raw Tff7b72/ T79c0ff4Tb4b4b4;
Tb4b4b4}

Te6edf3virtual Tffa657void Te6edf3powerOffTb4b4b4(Tb4b4b4) Te6edf3overrideTb4b4b4;
Tffa657void Td2a8ffenterDeepSleepTb4b4b4(Tffa657uint32_t Te6edf3secsTb4b4b4)Tb4b4b4;

Tffa657uint32_t Td2a8ffgetIRQGpioTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tff7b72return Te6edf3P_LORA_DIO_1Tb4b4b4; T8b949e// default for SX1262
Tb4b4b4}

Tffa657void Td2a8ffsleepTb4b4b4(Tffa657uint32_t Te6edf3secsTb4b4b4) Te6edf3override Tb4b4b4{
T8b949e// Skip if not allow to sleep
Tff7b72if Tb4b4b4(Te6edf3inhibit_sleepTb4b4b4) Tb4b4b4{
Te6edf3delayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4; T8b949e// Give MCU to OTA to run
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Set GPIO wakeup
Te6edf3gpio_num_t Te6edf3wakeupPin Tff7b72= Tb4b4b4(Te6edf3gpio_num_tTb4b4b4)Te6edf3getIRQGpioTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Configure timer wakeup
Tff7b72if Tb4b4b4(Te6edf3secs Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3esp_sleep_enable_timer_wakeupTb4b4b4(Te6edf3secs Tff7b72* T79c0ff1000000ULLTb4b4b4)Tb4b4b4; T8b949e// Wake up periodically to do scheduled jobs
Tb4b4b4}

T8b949e// Disable CPU interrupt servicing
Te6edf3portENTER_CRITICALTb4b4b4(Tff7b72&Te6edf3sleepMuxTb4b4b4)Tb4b4b4;

T8b949e// Skip sleep if there is a LoRa packet
Tff7b72if Tb4b4b4(Te6edf3gpio_get_levelTb4b4b4(Te6edf3wakeupPinTb4b4b4) Tff7b72=Tff7b72= Te6edf3HIGHTb4b4b4) Tb4b4b4{
Te6edf3portEXIT_CRITICALTb4b4b4(Tff7b72&Te6edf3sleepMuxTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

T8b949e// Configure GPIO wakeup
Te6edf3esp_sleep_enable_gpio_wakeupTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3gpio_wakeup_enableTb4b4b4(Tb4b4b4(Te6edf3gpio_num_tTb4b4b4)Te6edf3wakeupPinTb4b4b4, Te6edf3GPIO_INTR_HIGH_LEVELTb4b4b4)Tb4b4b4; T8b949e// Wake up when receiving a LoRa packet

T8b949e// MCU enters light sleep
Te6edf3esp_light_sleep_startTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Avoid ISR flood during wakeup due to HIGH LEVEL interrupt
Te6edf3gpio_wakeup_disableTb4b4b4(Te6edf3wakeupPinTb4b4b4)Tb4b4b4;
Te6edf3gpio_set_intr_typeTb4b4b4(Te6edf3wakeupPinTb4b4b4, Te6edf3GPIO_INTR_POSEDGETb4b4b4)Tb4b4b4;

T8b949e// Enable CPU interrupt servicing
Te6edf3portEXIT_CRITICALTb4b4b4(Tff7b72&Te6edf3sleepMuxTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657uint8_t Td2a8ffgetStartupReasonTb4b4b4(Tb4b4b4) Tff7b72const Te6edf3override Tb4b4b4{ Tff7b72return Te6edf3startup_reasonTb4b4b4; Tb4b4b4}

Tff7b72#Tff7b72if defined(P_LORA_TX_LED)
Tffa657void Td2a8ffonBeforeTransmitTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3P_LORA_TX_LEDTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4; T8b949e// turn TX LED on
Tb4b4b4}
Tffa657void Td2a8ffonAfterTransmitTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3P_LORA_TX_LEDTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4; T8b949e// turn TX LED off
Tb4b4b4}
Tff7b72#Tff7b72elif defined(P_LORA_TX_NEOPIXEL_LED)
Tff7b72#Tff7b72define NEOPIXEL_BRIGHTNESS 64 T8b949e// white brightness (max 255)

Tffa657void Td2a8ffonBeforeTransmitTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3neopixelWriteTb4b4b4(Te6edf3P_LORA_TX_NEOPIXEL_LEDTb4b4b4, Te6edf3NEOPIXEL_BRIGHTNESSTb4b4b4, Te6edf3NEOPIXEL_BRIGHTNESSTb4b4b4, Te6edf3NEOPIXEL_BRIGHTNESSTb4b4b4)Tb4b4b4; T8b949e// turn TX neopixel on (White)
Tb4b4b4}
Tffa657void Td2a8ffonAfterTransmitTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3neopixelWriteTb4b4b4(Te6edf3P_LORA_TX_NEOPIXEL_LEDTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4; T8b949e// turn TX neopixel off
Tb4b4b4}
Tff7b72#Tff7b72endif

Tffa657uint16_t Td2a8ffgetBattMilliVoltsTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tff7b72#Tff7b72ifdef PIN_VBAT_READ
Te6edf3analogReadResolutionTb4b4b4(T79c0ff12Tb4b4b4)Tb4b4b4;

Tffa657uint32_t Te6edf3raw Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff4Tb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3raw Tff7b72+Tff7b72= Te6edf3analogReadMilliVoltsTb4b4b4(Te6edf3PIN_VBAT_READTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3raw Tff7b72= Te6edf3raw Tff7b72/ T79c0ff4Tb4b4b4;

Tff7b72return Tb4b4b4(T79c0ff2 Tff7b72* Te6edf3rawTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72return T79c0ff0Tb4b4b4; T8b949e// not supported
Tff7b72#Tff7b72endif
Tb4b4b4}

Tff7b72const Tffa657charTff7b72* Td2a8ffgetManufacturerNameTb4b4b4(Tb4b4b4) Tff7b72const Te6edf3override Tb4b4b4{
Tff7b72return Ta5d6ff"Ta5d6ffGeneric ESP32Ta5d6ff"Tb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffrebootTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Te6edf3esp_restartTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657bool Td2a8ffstartOTAUpdateTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3idTb4b4b4, Tffa657char Te6edf3replyTb4b4b4[Tb4b4b4]Tb4b4b4) Te6edf3overrideTb4b4b4;

Tffa657void Td2a8ffsetInhibitSleepTb4b4b4(Tffa657bool Te6edf3inhibitTb4b4b4) Tb4b4b4{
Te6edf3inhibit_sleep Tff7b72= Te6edf3inhibitTb4b4b4;
Tb4b4b4}

Tffa657uint32_t Td2a8ffgetResetReasonTb4b4b4(Tb4b4b4) Tff7b72const Te6edf3override Tb4b4b4{
Tff7b72return Te6edf3esp_reset_reasonTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// https://docs.espressif.com/projects/esp-idf/en/v4.4.7/esp32/api-reference/system/system.html
Tff7b72const Tffa657charTff7b72* Td2a8ffgetResetReasonStringTb4b4b4(Tffa657uint32_t Te6edf3reasonTb4b4b4) Tb4b4b4{
Tff7b72switch Tb4b4b4(Te6edf3reasonTb4b4b4) Tb4b4b4{
Tff7b72case Tff7b72ESP_RST_UNKNOWNTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffUnknown or first bootTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_POWERONTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPower-on resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_EXTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffExternal resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_SWTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSoftware resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_PANICTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPanic / exception resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_INT_WDTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffInterrupt watchdog resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_TASK_WDTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffTask watchdog resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_WDTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffOther watchdog resetTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_DEEPSLEEPTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffWake from deep sleepTa5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_BROWNOUTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffBrownout (low voltage)Ta5d6ff"Tb4b4b4;
Tff7b72case Tff7b72ESP_RST_SDIOTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSDIO resetTa5d6ff"Tb4b4b4;
Tff7b72defaultTff7b72:
Tff7b72static Tffa657char Te6edf3bufTb4b4b4[T79c0ff40Tb4b4b4]Tb4b4b4;
Te6edf3snprintfTb4b4b4(Te6edf3bufTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffUnknown reset reason (%d)Ta5d6ff"Tb4b4b4, Te6edf3reasonTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3bufTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Te6edf3class Te6edf3ESP32RTCClock Tff7b72: Te6edf3public Te6edf3meshTff7b72:Tff7b72:Te6edf3RTCClock Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3ESP32RTCClockTb4b4b4(Tb4b4b4) Tb4b4b4{ Tb4b4b4}
Tffa657void Te6edf3beginTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3esp_reset_reason_t Te6edf3reason Tff7b72= Te6edf3esp_reset_reasonTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3reason Tff7b72=Tff7b72= Te6edf3ESP_RST_POWERONTb4b4b4) Tb4b4b4{
T8b949e// start with some date/time in the recent past
Tff7b72struct T56d364timeval Te6edf3tvTb4b4b4;
Te6edf3tvTb4b4b4.Te6edf3tv_sec Tff7b72= T79c0ff1715770351Tb4b4b4; T8b949e// 15 May 2024, 8:50pm
Te6edf3tvTb4b4b4.Te6edf3tv_usec Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3settimeofdayTb4b4b4(Tff7b72&Te6edf3tvTb4b4b4, Tffa657NULLTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tffa657uint32_t Te6edf3getCurrentTimeTb4b4b4(Tb4b4b4) Te6edf3override Tb4b4b4{
Tffa657time_t Te6edf3_nowTb4b4b4;
Te6edf3timeTb4b4b4(Tff7b72&Te6edf3_nowTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3_nowTb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3setCurrentTimeTb4b4b4(Tffa657uint32_t Te6edf3timeTb4b4b4) Te6edf3override Tb4b4b4{
Tff7b72struct T56d364timeval Te6edf3tvTb4b4b4;
Te6edf3tvTb4b4b4.Te6edf3tv_sec Tff7b72= Te6edf3timeTb4b4b4;
Te6edf3tvTb4b4b4.Te6edf3tv_usec Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3settimeofdayTb4b4b4(Tff7b72&Te6edf3tvTb4b4b4, Tffa657NULLTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Tff7b72#Tff7b72endif

Served by rngit 1.5.4 - Generated in 0.1s